// usage-example.js - 网络请求使用示例

import api from './api';
import request from './request';
import { RequestError } from './request';
import { ErrorCode } from './errorCode';

/**
 * 示例 1：登录功能
 */
export const loginExample = async (phone, password) => {
  try {
    // 调用登录 API
    const data = await api.user.login(phone, password);
    
    // 存储 token
    localStorage.setItem('token', data.token);
    localStorage.setItem('userInfo', JSON.stringify(data.userInfo));
    localStorage.setItem('isLoggedIn', 'true');
    
    console.log('登录成功');
    return data;
  } catch (error) {
    if (error instanceof RequestError) {
      // 处理业务错误
      switch (error.code) {
        case ErrorCode.USER_NOT_FOUND:
          console.error('用户不存在');
          break;
        case ErrorCode.PASSWORD_ERROR:
          console.error('密码错误');
          break;
        default:
          console.error(error.message);
      }
    } else {
      // 处理网络错误
      console.error('登录失败:', error.message);
    }
    throw error;
  }
};

/**
 * 示例 2：获取列表数据（带分页）
 */
export const getCourseListExample = async (page = 1, size = 10) => {
  try {
    const data = await api.course.getCourseList({
      page,
      size,
      // 其他查询参数
      status: 'active'
    });
    
    return {
      list: data.list || [],
      total: data.total || 0
    };
  } catch (error) {
    console.error('获取课程列表失败:', error);
    return {
      list: [],
      total: 0
    };
  }
};

/**
 * 示例 3：创建数据
 */
export const createCourseExample = async (courseData) => {
  try {
    const result = await api.course.createCourse({
      courseName: courseData.courseName,
      courseIntro: courseData.courseIntro,
      studentPhones: courseData.studentPhones
    });
    
    console.log('课程创建成功:', result);
    return result;
  } catch (error) {
    console.error('创建课程失败:', error);
    throw error;
  }
};

/**
 * 示例 4：上传文件（单个）
 */
export const uploadFileExample = async (file) => {
  try {
    // 验证文件
    if (!file) {
      throw new Error('请选择文件');
    }
    
    // 上传
    const result = await api.course.uploadCourseCover(file);
    
    console.log('文件上传成功:', result);
    return result.url; // 返回文件 URL
  } catch (error) {
    console.error('文件上传失败:', error);
    throw error;
  }
};

/**
 * 示例 5：批量上传文件
 */
export const uploadMultipleFilesExample = async (files) => {
  try {
    if (!files || files.length === 0) {
      throw new Error('请选择文件');
    }
    
    // 批量上传
    const results = await api.file.uploadFiles(files, 'video');
    
    console.log('批量上传成功:', results);
    return results;
  } catch (error) {
    console.error('批量上传失败:', error);
    throw error;
  }
};

/**
 * 示例 6：更新数据
 */
export const updateCourseExample = async (courseId, updateData) => {
  try {
    const result = await api.course.updateCourse(courseId, updateData);
    
    console.log('课程更新成功');
    return result;
  } catch (error) {
    if (error instanceof RequestError) {
      if (error.code === ErrorCode.COURSE_NOT_FOUND) {
        console.error('课程不存在');
      }
    }
    throw error;
  }
};

/**
 * 示例 7：删除数据（带确认）
 */
export const deleteCourseExample = async (courseId) => {
  try {
    // 二次确认
    const confirmed = window.confirm('确定要删除这个课程吗？');
    if (!confirmed) {
      return false;
    }
    
    await api.course.deleteCourse(courseId);
    
    console.log('课程删除成功');
    return true;
  } catch (error) {
    console.error('删除课程失败:', error);
    throw error;
  }
};

/**
 * 示例 8：不显示加载提示的请求
 */
export const silentRequestExample = async () => {
  try {
    // 静默请求，不显示 loading
    const data = await request.get('/api/data', {}, {
      needLoading: false,
      showErrorMsg: false
    });
    
    return data;
  } catch (error) {
    // 静默处理错误
    console.error('请求失败:', error);
    return null;
  }
};

/**
 * 示例 9：自定义加载文字
 */
export const customLoadingTextExample = async (data) => {
  try {
    const result = await request.post('/api/submit', data, {
      loadingText: '提交中，请稍候...'
    });
    
    return result;
  } catch (error) {
    console.error('提交失败:', error);
    throw error;
  }
};

/**
 * 示例 10：下载文件
 */
export const downloadFileExample = async (fileUrl, fileName) => {
  try {
    await api.file.downloadFile(fileUrl, fileName);
    console.log('文件下载成功');
  } catch (error) {
    console.error('文件下载失败:', error);
    throw error;
  }
};

/**
 * 示例 11：在 React 组件中使用
 */
export const ReactComponentExample = `
import React, { useState, useEffect } from 'react';
import api from '@/utils/api';
import { RequestError } from '@/utils/request';

function CourseList() {
  const [courses, setCourses] = useState([]);
  const [loading, setLoading] = useState(false);
  const [page, setPage] = useState(1);
  const [total, setTotal] = useState(0);

  // 获取课程列表
  useEffect(() => {
    fetchCourses();
  }, [page]);

  const fetchCourses = async () => {
    setLoading(true);
    try {
      const data = await api.course.getCourseList({
        page,
        size: 10
      });
      setCourses(data.list);
      setTotal(data.total);
    } catch (error) {
      console.error('获取课程列表失败:', error);
      setCourses([]);
    } finally {
      setLoading(false);
    }
  };

  // 删除课程
  const handleDelete = async (id) => {
    if (!window.confirm('确定要删除吗？')) {
      return;
    }

    try {
      await api.course.deleteCourse(id);
      alert('删除成功');
      fetchCourses(); // 刷新列表
    } catch (error) {
      // 错误已在 request 中自动显示
    }
  };

  // 上传封面
  const handleUploadCover = async (file, courseId) => {
    try {
      const result = await api.course.uploadCourseCover(file);
      // 更新课程封面
      await api.course.updateCourse(courseId, {
        coverUrl: result.url
      });
      alert('封面上传成功');
      fetchCourses();
    } catch (error) {
      console.error('上传失败:', error);
    }
  };

  return (
    <div>
      {loading ? (
        <div>加载中...</div>
      ) : (
        <>
          <ul>
            {courses.map(course => (
              <li key={course.id}>
                {course.name}
                <button onClick={() => handleDelete(course.id)}>删除</button>
              </li>
            ))}
          </ul>
          <div>
            <button 
              disabled={page <= 1} 
              onClick={() => setPage(page - 1)}
            >
              上一页
            </button>
            <span>{page} / {Math.ceil(total / 10)}</span>
            <button 
              disabled={page >= Math.ceil(total / 10)} 
              onClick={() => setPage(page + 1)}
            >
              下一页
            </button>
          </div>
        </>
      )}
    </div>
  );
}

export default CourseList;
`;

/**
 * 示例 12：错误处理最佳实践
 */
export const errorHandlingExample = async () => {
  try {
    const data = await api.user.getUserInfo();
    return data;
  } catch (error) {
    if (error instanceof RequestError) {
      // 业务错误
      switch (error.code) {
        case ErrorCode.UNAUTHORIZED:
          // 未登录 - 已自动跳转登录页
          console.log('请先登录');
          break;
        
        case ErrorCode.PERMISSION_DENIED:
          // 权限不足
          console.log('权限不足，无法访问');
          alert('您没有权限访问该资源');
          break;
        
        case ErrorCode.TOKEN_EXPIRED:
          // Token 过期 - 已自动处理
          console.log('登录已过期');
          break;
        
        default:
          // 其他业务错误
          console.error('业务错误:', error.message);
      }
    } else {
      // 网络错误或其他错误
      console.error('请求失败:', error.message);
      
      // 可以根据错误类型做不同处理
      if (error.message === '请求超时') {
        alert('网络请求超时，请检查网络连接');
      }
    }
    
    throw error;
  }
};

